home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / MCQUAY1 / MENUTOOL.PAS < prev    next >
Pascal/Delphi Source File  |  1995-05-22  |  9KB  |  342 lines

  1. {*************************************************
  2.  Menu Tools for Turbo Vision
  3.  A Set of functions to modify TV Menus
  4.  Copyright 1995 McQuay Technologies
  5.  Released into the public domain
  6.  **************************************************}
  7. unit MenuTool;
  8. interface
  9.   uses Objects, Menus;
  10.  
  11.   function  MS_MaxLabel(P:Pmenu):word;
  12.   function  MS_BarSize(P:Pmenu):word;
  13.   function  MS_count(P:Pmenu):word;
  14.   function  MS_Type(P:PMenuItem):word;
  15.   function  MS_Member(P:Pmenu;Item:PmenuItem):boolean;
  16.   function  MS_Prev(P:Pmenu;Item:PmenuItem):PmenuItem;
  17.   procedure MS_SwapItems(P:Pmenu;P1,P2:PmenuItem);
  18.   procedure MS_DisposeMenuItem(P:PmenuItem);
  19.   procedure MS_Insert(P:Pmenu;AtItem,NewItem:PmenuItem);
  20.   procedure MS_Delete(P:Pmenu;Item:PmenuItem);
  21.   function  MS_DupNewItem(Item:PmenuItem):PmenuItem;
  22.   procedure MS_DisableItem(Item:PMenuItem);
  23.   procedure MS_EnableItem (Item:PMenuItem);
  24.   procedure MS_DisableCommand(P:Pmenu;Command:word);
  25.   procedure MS_EnableCommand (P:Pmenu;Command:word);
  26.   function  MS_FindCommand(P:Pmenu;Command:word):PmenuItem;
  27.   procedure MS_RenameItem(Item:PMenuItem; name:TMenuStr);
  28.  
  29. implementation
  30.   const
  31.     LineItem = 1;
  32.     SubMenuItem = 2;
  33.     CommandItem = 0;
  34.  {------------------------------------------------------------------}
  35.   function MS_MaxLabel(P:Pmenu):word;
  36.     var
  37.       Temp:PmenuItem;
  38.       i:word;
  39.     begin
  40.     I := 0;
  41.     if P<>nil then
  42.       begin
  43.       Temp := P^.items;
  44.       while Temp<>nil do
  45.         begin
  46.         if Temp^.name <> nil then
  47.           if length(Temp^.name^)>i then
  48.             i:=Length(Temp^.name^);
  49.         Temp := Temp^.next;
  50.         end;
  51.      end;
  52.    MS_MaxLabel := i;
  53.    end;
  54.  {------------------------------------------------------------------}
  55.   function MS_BarSize(P:Pmenu):word;
  56.     var
  57.       Temp:PmenuItem;
  58.       i:word;
  59.     begin
  60.     I := 0;
  61.     if P<>nil then
  62.       begin
  63.       Temp := P^.items;
  64.       while Temp<>nil do
  65.         begin
  66.         if Temp^.name <> nil then
  67.             i:=I+Length(Temp^.name^) +2;
  68.         Temp := Temp^.next;
  69.         end;
  70.      end;
  71.    MS_BarSize := i;
  72.    end;
  73.  {------------------------------------------------------------------}
  74.   function MS_count(P:Pmenu):word;
  75.     var
  76.       Temp:PmenuItem;
  77.       i:word;
  78.     begin
  79.     if P<>nil then
  80.       begin
  81.       I := 0;
  82.       Temp := P^.items;
  83.       while Temp<>nil do
  84.         begin
  85.         Inc(i);
  86.         Temp := Temp^.next;
  87.         end;
  88.       MS_Count := i;
  89.       end
  90.     else
  91.       MS_Count := 0;
  92.     end;
  93.  {------------------------------------------------------------------}
  94.  function MS_Type(P:PMenuItem):word;
  95.    begin
  96.    if P<>nil then
  97.      begin
  98.      with P^ do
  99.       If Name=nil Then MS_Type:=1 else
  100.         if Command=0 then MS_Type:=2 else
  101.            MS_Type := 0;
  102.      end
  103.    else
  104.      MS_Type := $ffff;
  105.    end;
  106.   {------------------------------------------------------------------}
  107.    function MS_Member(P:Pmenu;Item:PmenuItem):boolean;
  108.    var
  109.      TemP:PmenuItem;
  110.    begin
  111.    if P<>nil then
  112.      begin
  113.      Temp := P^.items;
  114.      while (Temp<>nil) and (Temp<>Item) do
  115.        Temp := Temp^.next;
  116.      if Temp<>nil then
  117.        MS_member := true
  118.      else
  119.        MS_Member := false;
  120.      end
  121.    else
  122.      MS_member := false;
  123.    end;
  124.   {------------------------------------------------------------------}
  125.   function MS_Prev(P:Pmenu;Item:PmenuItem):PmenuItem;
  126.    var
  127.      TemP,Prev:PmenuItem;
  128.    begin
  129.    if P<>nil then
  130.      begin
  131.      Temp := P^.items;
  132.      Prev := nil;
  133.      while (Temp<>nil) and (Temp<>Item) do
  134.        begin
  135.        prev := Temp;
  136.        Temp := Temp^.next;
  137.        end;
  138.      if Temp<>nil then
  139.        MS_Prev := prev
  140.      else
  141.        MS_Prev := nil;
  142.      end;
  143.    end;
  144.  {------------------------------------------------------------------}
  145.  procedure MS_SwapItems(P:Pmenu;P1,P2:PmenuItem);
  146.    var
  147.      Prev1,Prev2,temp:PmenuItem;
  148.    begin
  149.    if (P<>nil) and (MS_member(P,P1))and(MS_Member(P,P2)) then
  150.      begin
  151.      { Get Previous }
  152.      Prev1 := MS_Prev(P,P1);
  153.      Prev2 := MS_Prev(P,P2);
  154.      {  Save P2's next becuase we set it first }
  155.      Temp := P2^.next;
  156.      { If Prev = nil then it is top of list }
  157.      if Prev1 = nil then
  158.        P^.items := p2
  159.      else
  160.        { if the prev is not the other then set next }
  161.        If Prev1<>P2 then
  162.          Prev1^.next := P2;
  163.      { If Prev = nil then it is top of list }
  164.      if Prev2 = nil then
  165.        P^.items := p1
  166.      else
  167.        { if the prev is not the other then set next }
  168.        If Prev2<>P1 then
  169.          Prev2^.next := P1;
  170.      { If P1 not above P2 then swap else P2 > P1 }
  171.      if P1^.next<>p2 then
  172.        p2^.next := P1^.next
  173.      else
  174.        p2^.next := p1;
  175.      { If P2 not above P1 then swap else P1 > P2 }
  176.      if Temp<>p1 then
  177.        p1^.next := temp
  178.      else
  179.        p1^.next := p2;
  180.      end;
  181.    end;
  182.  {----------------------------------------------------------------}
  183.   procedure MS_DisposeMenuItem(P:PmenuItem);
  184.     begin
  185.     If P<>nil then
  186.       begin
  187.       if P^.name <> nil then
  188.         begin
  189.         disposeStr(P^.name);
  190.         if(P^.command <>0) then
  191.           begin
  192.           if (P^.param <> nil) then
  193.             disposeStr(P^.param);
  194.           end
  195.         else
  196.           if P^.submenu <> nil then disposeMenu(P^.submenu);
  197.         end;
  198.       dispose(P);
  199.       end;
  200.     end;
  201.  {----------------------------------------------------------------}
  202.   procedure MS_Insert(P:Pmenu;AtItem,NewItem:PmenuItem);
  203.     var
  204.       Prev:PmenuItem;
  205.     begin
  206.     if (P<>nil)and(NewItem<>nil) then
  207.       if P^.items = nil
  208.         then P^.items := NewItem
  209.       else
  210.         if AtItem = Nil then
  211.           begin
  212.           NewItem^.next := P^.items;
  213.           P^.items := NewItem;
  214.           end
  215.         else
  216.           if MS_member(P,AtItem) then
  217.             begin
  218.             Prev := MS_prev(P,AtItem);
  219.             if Prev=nil then
  220.               P^.items := NewItem
  221.             else
  222.               Prev^.next := NewItem;
  223.             NewItem^.next := AtItem;
  224.             end;
  225.     end;
  226.  {----------------------------------------------------------------}
  227.   procedure MS_Delete(P:Pmenu;Item:PmenuItem);
  228.     var
  229.       Prev:PmenuItem;
  230.     begin
  231.     if (P<>nil)and(Item<>nil) then
  232.       if MS_member(P,Item) then
  233.         begin
  234.         Prev := MS_prev(P,Item);
  235.         if Prev=nil then
  236.           P^.items := Item^.next
  237.         else
  238.           Prev^.next := Item^.next;
  239.         end;
  240.     end;
  241.   {----------------------------------------------------------------}
  242.   function MS_DupNewItem(Item:PmenuItem):PmenuItem;
  243.     var
  244.       NewMenuItem:PmenuItem;
  245.       S:TmenuStr;
  246.       Dummy:Pmenu;
  247.     begin
  248.     with Item^ do
  249.       begin
  250.       case MS_Type(Item) of
  251.         LineItem:NewMenuItem := NewLine(nil);
  252.         CommandItem:
  253.           begin
  254.           if param = nil then
  255.             S:=''
  256.           else
  257.             S:=param^;
  258.           NewMenuItem := newItem(name^,S,KeyCode,Command,HelpCtx,nil);
  259.           end;
  260.         SubMenuItem : begin
  261.                       dummy := Newmenu(nil);
  262.                       NewMenuItem := NewSubmenu(name^,HelpCtx,dummy,nil);
  263.                       NewMenuItem^.command := 0;
  264.                       end;
  265.         end;
  266.       if NewMenuItem<>nil then
  267.         NewMenuItem^.disabled := disabled;
  268.       end;
  269.    MS_DupNewItem := NewMenuItem;
  270.    end;
  271.   {----------------------------------------------------------------}
  272.   function MS_FindCommand(P:Pmenu;Command:word):PmenuItem;
  273.     var
  274.       Temp,Stemp:PmenuItem;
  275.       found:boolean;
  276.     begin
  277.     Temp := nil;
  278.     found := false;
  279.     if P<>nil then
  280.       begin
  281.       Temp := P^.items;
  282.       while (Temp<>nil)and (not found) do
  283.         begin
  284.         case MS_type(temp) of
  285.           submenuitem:
  286.             begin
  287.             Stemp := MS_FindCommand(Temp^.submenu,command);
  288.             if Stemp<>nil then
  289.               begin
  290.               found := true;
  291.               Temp := Stemp;
  292.               end
  293.             end;
  294.           CommandItem:
  295.             if Temp^.command = command then found := true;
  296.           end;
  297.         if not found then
  298.           Temp := Temp^.next;
  299.         end;
  300.       end;
  301.     MS_FindCommand := Temp;
  302.       end;
  303.   {----------------------------------------------------------------}
  304.   procedure MS_DisableItem(Item:PMenuItem);
  305.     begin
  306.     if Item<>nil then
  307.       Item^.disabled := true;
  308.         end;
  309.   {----------------------------------------------------------------}
  310.     procedure MS_EnableItem (Item:PMenuItem);
  311.     begin
  312.     if Item<>nil then
  313.       Item^.disabled := false;
  314.       end;
  315.   {----------------------------------------------------------------}
  316.     procedure MS_DisableCommand(P:Pmenu;Command:word);
  317.     var
  318.       Temp:PmenuItem;
  319.     begin
  320.     Temp := MS_FindCommand(P,Command);
  321.     MS_DisableItem(Temp);
  322.     end;
  323.   {----------------------------------------------------------------}
  324.   procedure MS_EnableCommand (P:Pmenu;Command:word);
  325.     var
  326.       Temp:PmenuItem;
  327.     begin
  328.     Temp := MS_FindCommand(P,Command);
  329.     MS_EnableItem(Temp);
  330.     end;
  331.   {----------------------------------------------------------------}
  332.     procedure MS_RenameItem(Item:PMenuItem; name:TMenuStr);
  333.     begin
  334.  
  335.     if Item<>nil then
  336.       begin
  337.       disposestr(Item^.name);
  338.        Item^.name := newstr(name);
  339.       end;
  340.     end;
  341. end.
  342.